From b0d95e2da85fb0373079ad32feefe12c07ddd430 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Thu, 31 Aug 2017 05:32:42 +0200 Subject: [PATCH] babl: add separate functions for 1.8 and 2.2 gamma --- babl/babl-trc.c | 17 +++++++++++++++-- babl/babl-trc.h | 25 ++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/babl/babl-trc.c b/babl/babl-trc.c index 8992200..3b32f74 100644 --- a/babl/babl-trc.c +++ b/babl/babl-trc.c @@ -112,6 +112,14 @@ babl_trc_new (const char *name, trc_db[i].fun_to_linear = _babl_trc_gamma_to_linear; trc_db[i].fun_from_linear = _babl_trc_gamma_from_linear; break; + case BABL_TRC_GAMMA_2_2: + trc_db[i].fun_to_linear = _babl_trc_gamma_2_2_to_linear; + trc_db[i].fun_from_linear = _babl_trc_gamma_2_2_from_linear; + break; + case BABL_TRC_GAMMA_1_8: + trc_db[i].fun_to_linear = _babl_trc_gamma_1_8_to_linear; + trc_db[i].fun_from_linear = _babl_trc_gamma_1_8_from_linear; + break; case BABL_TRC_SRGB: trc_db[i].fun_to_linear = _babl_trc_srgb_to_linear; trc_db[i].fun_from_linear = _babl_trc_srgb_from_linear; @@ -144,14 +152,19 @@ babl_trc_gamma (double gamma) { char name[32]; int i; - if (fabs (gamma - 1.0) < 0.0001) + if (fabs (gamma - 1.0) < 0.01) return babl_trc_new ("linear", BABL_TRC_LINEAR, 1.0, 0, NULL); + if (fabs (gamma - 1.8) < 0.01) + return babl_trc_new ("1.8", BABL_TRC_GAMMA_1_8, 1.8, 0, NULL); + if (fabs (gamma - 2.2) < 0.01) + return babl_trc_new ("2.2", BABL_TRC_GAMMA_2_2, 2.2, 0, NULL); + sprintf (name, "%.6f", gamma); for (i = 0; name[i]; i++) if (name[i] == ',') name[i] = '.'; while (name[strlen(name)-1]=='0') name[strlen(name)-1]='\0'; - return babl_trc_new (name, BABL_TRC_GAMMA, gamma, 0, NULL); + return babl_trc_new (name, BABL_TRC_GAMMA, gamma, 0, NULL); } void diff --git a/babl/babl-trc.h b/babl/babl-trc.h index caec30c..dbdf2fe 100644 --- a/babl/babl-trc.h +++ b/babl/babl-trc.h @@ -27,8 +27,11 @@ BABL_CLASS_DECLARE (trc); typedef enum {BABL_TRC_LINEAR, BABL_TRC_GAMMA, + BABL_TRC_GAMMA_1_8, + BABL_TRC_GAMMA_2_2, BABL_TRC_SRGB, - BABL_TRC_LUT} BablTRCType; + BABL_TRC_LUT} +BablTRCType; typedef struct { @@ -374,6 +377,26 @@ static inline float _babl_trc_gamma_from_linear (const Babl *trc_, float value) return babl_powf (value, trc->rgamma); } +static inline float _babl_trc_gamma_2_2_to_linear (const Babl *trc_, float value) +{ + return babl_powf (value, 2.2); +} + +static inline float _babl_trc_gamma_2_2_from_linear (const Babl *trc_, float value) +{ + return babl_powf (value, 1.0/2.2); +} + +static inline float _babl_trc_gamma_1_8_to_linear (const Babl *trc_, float value) +{ + return babl_powf (value, 1.8); +} + +static inline float _babl_trc_gamma_1_8_from_linear (const Babl *trc_, float value) +{ + return babl_powf (value, 1.0/1.8); +} + static inline float _babl_trc_srgb_to_linear (const Babl *trc_, float value) { return babl_gamma_2_2_to_linear (value); -- 2.30.2